<?php
/**
 *
 * Created by IntelliJ IDEA.
 * User: XD
 * Date: 2017/8/22
 * Time: 10:59
 */

 class Child_Site extends Site{
     var $category;

     // 方法扩展
     function setCate($par){
         $this->category = $par;
     }

     function getCate(){
         echo $this->category.PHP_EOL;
     }

     // 方法重写
     function getUrl(){
         echo $this ->url.PHP_EOL;
         return $this->url;
     }

     function getTitle()
     {
         echo $this->title.PHP_EOL;
         return $this ->title;

     }


 }
 // 访问控制
 class MyClass
 {
     public $public = 'Public';
     protected  $protected = 'Protected';
     private $private = 'Private';
     function printHello(){
         echo $this->public;
         echo $this->protected;
         echo $this->private;
     }
 }

 $obj = new MyClass();
 echo $obj->public;
//echo $obj->protected; // 这行会产生一个致命错误
//echo $obj->private; // 这行也会产生一个致命错误
$obj->printHello(); // 输出 Public、Protected 和 Private

class MyClass2 extends MyClass
{
    // 可以对 public 和 protected 进行重定义，但 private 而不能
    protected $protected = 'Protected2';


    function printHello()
    {
        echo $this->public;
        echo $this->protected;
        //echo $this->private;  // 这行有错
    }
}

$obj2 = new MyClass2();
echo $obj2->public; // 这行能被正常执行
//echo $obj2->private; // 未定义 private
//echo $obj2->protected; // 这行会产生一个致命错误
$obj2->printHello(); // 输出 Public、Protected2 和 Undefined

// 方法访问控制
class MyClassFunction
{
    // 声明一个公有的构造函数
    public function __construct()
    {
    }

    // 声明一个公有的方法
    public function MyPublic(){

    }

    // 声明一个受保护的方法
    protected function MyProtected() { }

    // 声明一个私有的方法
    private function MyPrivate() { }

    // 此方法为公有
    function Foo(){
        $this->MyPublic();
        $this->MyProtected();
        $this->MyPrivate();
    }
}

$myclass = new MyClassFunction();
$myclass->MyPublic(); // 这行能被正常执行
//$myclass->MyProtected(); // 这行会产生一个致命错误
//$myclass->MyPrivate(); // 这行会产生一个致命错误
$myclass->Foo(); // 公有，受保护，私有都可以执行

class MyClassFunction2 extends MyClassFunction
{
    // 此方法为公有
    function Foo2()
    {
        $this->MyPublic();
        $this->MyProtected();
        //$this->MyPrivate(); // 这行会产生一个致命错误
    }
}

$myclass2 = new MyClass2;
$myclass2->MyPublic(); // 这行能被正常执行
$myclass2->Foo2(); // 公有的和受保护的都可执行，但私有的不行

class Bar
{
    public function test() {
        $this->testPrivate();
        $this->testPublic();
    }

    public function testPublic() {
        echo "Bar::testPublic\n";
    }

    private function testPrivate() {
        echo "Bar::testPrivate\n";
    }
}

class Foo extends Bar
{
    public function testPublic() {
        echo "Foo::testPublic\n";
    }

    private function testPrivate() {
        echo "Foo::testPrivate\n";
    }
}

$myFoo = new foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic

?>